package com.itheima.d1_set;

import java.util.Comparator;
import java.util.TreeSet;

//目标：掌握TreeSet集合自定义排序规则的方式
public class Demo4 {
    public static void main(String[] args) {
        /**
         * TreeSet集合特点：不重复、无索引、可排序，底层基于红黑树
         *
         * 自定义排序规则方式：
         *      方式一：让自定义的类实现Comparable接口，重写里面的compareTo方法来指定比较规则
         *      方式二：调用TreeSet集合有参数构造器，可以设置Comparator对象（比较器对象，用于指定比较规则）
         */

        //1.对于数值类型，默认按照数值大小升序排序；对于字符串类型，默认按照首字符在编码表中编号升序排序
        TreeSet<Integer> set1 = new TreeSet<>();
        set1.add(3);
        set1.add(1);
        set1.add(2);
        System.out.println(set1);

        TreeSet<String> set2 = new TreeSet<>();
        set2.add("c");
        set2.add("b");
        set2.add("a");
        System.out.println(set2);
        System.out.println("---------------------");

        //2.对于自定义类型，必须指定排序规则
        TreeSet<Teacher> teas = new TreeSet<>();
        Teacher tea1 = new Teacher("张三", 26, 188.5);
        Teacher tea2 = new Teacher("李四", 24, 172.5);
        Teacher tea3 = new Teacher("王五", 25, 171.3);
        Teacher tea4 = new Teacher("张三", 26, 188.3);
        teas.add(tea1);
        teas.add(tea2);
        teas.add(tea3);
        teas.add(tea4);
        System.out.println(teas);
        System.out.println("------------------------------");
        //3.需求：对teas集合中的对象按照年龄升序排序，如果年龄相同，就按照身高升序排序
        //3.1 方案一：让Teacher类实现Comparable接口，重写方法，制定排序规则

        //3.2 已经制定排序规则后，直接运行，TreeSet底层红黑树结构会自动调用Teacher的compareTo方法拿到返回值，进行排序

        //3.3 方案二：提供一个Comparator比较器去制定排序规则，这是一个函数式接口，所以可以创建匿名内部类
        Comparator<Teacher> comparator = new Comparator<Teacher>() {
            @Override
            public int compare(Teacher o1, Teacher o2) {
                //这个方法也是用来制定排序规则的：根据年龄降序排序，如果年龄相同，按身高升序排序

                //获取两个对象的年龄
                int age1 = o1.getAge();
                int age2 = o2.getAge();

                //获取两个对象年龄的比较结果
                int result = age2 - age1;

                //判断result是否为0
                if (result == 0) {
                    //条件成立，根据身高比较
                    double height1 = o1.getHeight();
                    double height2 = o2.getHeight();

                    result = Double.compare(height1, height2);
                }
                return result;
            }
        };

        //3.4 创建TreeSet集合对象，传入Comparator比较器，集合底层的红黑树结构就会拿到排序规则了！
        TreeSet<Teacher> set3 = new TreeSet<>(comparator);

        set3.add(tea1);
        set3.add(tea2);
        set3.add(tea3);
        set3.add(tea4);

        System.out.println(set3);
    }
}
